const fs = require('fs');
const path = require('path');
const axios = require('axios');
const crypto = require('crypto');
const { HttpsProxyAgent } = require('https-proxy-agent');

/**
 * 确保目录存在，不存在则创建
 */
function ensureDirectoryExists(dirPath) {
  if (!fs.existsSync(dirPath)) {
    fs.mkdirSync(dirPath, { recursive: true });
  }
}

/**
 * 获取代理配置
 */
function getProxyConfig() {
  const proxyHost = process.env.PROXY_HOST;
  const proxyPort = process.env.PROXY_PORT;
  
  if (proxyHost && proxyPort) {
    const proxyUrl = `http://${proxyHost}:${proxyPort}`;
    return {
      httpAgent: new HttpsProxyAgent(proxyUrl),
      httpsAgent: new HttpsProxyAgent(proxyUrl),
      proxy: false  // 使用 agent 时需要禁用 axios 的 proxy
    };
  }
  
  return {};
}

/**
 * 下载图片并保存到本地
 * @param {string} imageUrl - 图片URL
 * @param {string} saveDir - 保存目录
 * @param {string} relativePrefix - 返回相对路径的前缀（默认'uploads/avatars/'）
 * @returns {Promise<string>} - 保存的文件相对路径
 */
async function downloadImage(imageUrl, saveDir, relativePrefix = 'uploads/avatars/') {
  try {
    if (!imageUrl) {
      return null;
    }
    
    // 确保保存目录存在
    ensureDirectoryExists(saveDir);
    
    // 获取代理配置
    const proxyConfig = getProxyConfig();
    
    // 下载图片
    const response = await axios({
      method: 'GET',
      url: imageUrl,
      responseType: 'arraybuffer',
      timeout: 30000,
      ...proxyConfig,
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
      }
    });
    
    // 获取文件扩展名
    const urlObj = new URL(imageUrl);
    const originalExt = path.extname(urlObj.pathname) || '.jpg';
    
    // 生成唯一文件名
    const hash = crypto.createHash('md5').update(imageUrl).digest('hex');
    const fileName = `${Date.now()}_${hash}${originalExt}`;
    const filePath = path.join(saveDir, fileName);
    
    // 保存文件
    fs.writeFileSync(filePath, response.data);
    
    // 返回相对路径
    const relativePath = `${relativePrefix}${fileName}`;
    
    return relativePath;
  } catch (error) {
    console.error(`下载图片失败: ${imageUrl}`, error.message);
    return null;
  }
}

/**
 * 从Markdown文本中提取第一张图片URL
 * @param {string} markdown - Markdown文本
 * @returns {string|null} - 第一张图片的URL，如果没有则返回null
 */
function extractFirstImageFromMarkdown(markdown) {
  if (!markdown) {
    return null;
  }

  // Markdown图片格式: ![alt](url) 或 ![alt](url "title")
  const imageRegex = /!\[.*?\]\((https?:\/\/[^\s)]+)/i;
  const match = markdown.match(imageRegex);
  
  if (match && match[1]) {
    return match[1].trim();
  }
  
  // 也尝试匹配HTML img标签: <img src="url">
  const htmlImageRegex = /<img[^>]+src=["']?(https?:\/\/[^\s"'>]+)["']?/i;
  const htmlMatch = markdown.match(htmlImageRegex);
  
  if (htmlMatch && htmlMatch[1]) {
    return htmlMatch[1].trim();
  }
  
  return null;
}

/**
 * 删除文件
 */
function deleteFile(filePath) {
  try {
    if (fs.existsSync(filePath)) {
      fs.unlinkSync(filePath);
      return true;
    }
    return false;
  } catch (error) {
    console.error('删除文件失败:', error.message);
    return false;
  }
}

module.exports = {
  ensureDirectoryExists,
  downloadImage,
  deleteFile,
  extractFirstImageFromMarkdown
};

